package com.skwen.ssm.util;

public class OidGen {

    private static OidGen instance = new OidGen();

    public static OidGen getInstance() {
        return instance;
    }

    private OidGen() {

    }

    private int id = 0;

//	/**
//	 * 方式1 性能更好 但是每秒不能超过65535条
//	 * @param serverId
//	 * @return
//	 */
//	public long getId(int serverId) {
//		synchronized (UUIDService.class) {
//			id=id>=0xFFFF?0:++id;
//			return (serverId) << 48 | (System.currentTimeMillis()/1000) << 16 | id;
//		}
//	}

    public static final long SIDMASK = 1000000000000000l;
    public static final long TIMEMASK = 100000;

    /**
     * 可读性更好 每秒生成十万条时 性能与位操作无明显差异  程序与ID的可读性更强
     * 有密集生成ID的时候 需要注意  单服每秒生成不超过9W个ID否则会出现重复
     *
     * @return
     */
    public long getId() {
        synchronized (OidGen.class) {
            id = id >= TIMEMASK ? 0 : ++id;
            return SIDMASK + System.currentTimeMillis() / 1000 * TIMEMASK + id;
        }
    }

}
